#include "CExcelTool.h"

#include <QFile>
#include <QDir>
#include <QApplication>
#include <QDebug>

#ifdef Q_OS_WIN
#include <QAxObject>
void CExcelTool::loadExcel(QString strSheetName, IExcelLoader *pLoader)
{
    if(strSheetName.contains(".xls")){//兼容老版本
        strSheetName = strSheetName.left(strSheetName.length()-4);
    }

    qDebug()<<"CExcelTool::loadExcel 开始处理文件";
    QString strPath = QApplication::applicationDirPath() + "/Table.xls";
    QFile file(strPath);
    if(!file.exists()){
        qWarning() << "CExcelTool::loadExcel 路径错误，或文件不存在,路径为"<<strPath;
        return;
    }

    qInfo()<<"启动excel...";
    QAxObject *excel = new QAxObject("Excel.Application");//excel应用程序
    qInfo()<<"设置界面不可见...";
    excel->dynamicCall("SetVisible(bool)", false); //true 表示操作文件时可见，false表示为不可见
    qInfo()<<"开始查找sheet页...";
    QAxObject *workbooks = excel->querySubObject("WorkBooks");//所有excel文件
    QAxObject *workbook = workbooks->querySubObject("Open(QString&)", strPath);//按照路径获取文件
    QAxObject * worksheets = workbook->querySubObject("WorkSheets");//获取文件的所有sheet页
    QAxObject * worksheet = worksheets->querySubObject("Item(QString)", strSheetName);//获取文件sheet页
    if(nullptr == worksheet){
        qWarning()<<"CExcelTool::loadExcel "<<strSheetName<<"Sheet页不存在。";
        return;
    }
    qInfo()<<"sheet页查找结束...";
    QAxObject * usedrange = worksheet->querySubObject("UsedRange");//有数据的矩形区域

    QAxObject * rows = usedrange->querySubObject("Rows");//获取行数
    int nRows = rows->property("Count").toInt();
    qDebug()<<"CExcelTool::loadExcel 文件数据行数为"<<nRows-1<<"，不含表头";
    if(nRows <= 1){
        qWarning()<<"CExcelTool::loadExcel 无数据，跳过该文件";
        return;
    }
    QAxObject * columns = usedrange->querySubObject("Columns");//获取列数
    int nColumns = columns->property("Count").toInt();
    qDebug()<<"CExcelTool::loadExcel 文件数据列数为"<<nColumns;

    QVector<QVector<QString>> vecDatas;//获取所有数据
    qInfo()<<"读可用数据...";
    for(int i = 2;i <= nRows;i++){//第一行默认为表头，从第二行读起
        QVector<QString> vecDataRow;
        for(int j = 1;j <= nColumns;j++){
            QAxObject *cell = worksheet->querySubObject("Cells(int,int)",i,j);
            QString strValue = cell->property("Value2").toString();
            vecDataRow.push_back(strValue);
        }
        vecDatas.push_back(vecDataRow);
    }
    qInfo()<<"数据载入vec完毕...";
    //关闭文件
    workbook->dynamicCall("Close()");
    excel->dynamicCall("Quit()");
    if (excel)
    {
        delete excel;
        excel = NULL;
    }

    qInfo()<<"开始导入...";
    pLoader->loadExcel(vecDatas);//输送数据
    qInfo()<<"CExcelTool::loadExcel 文件处理结束，"<<strSheetName;
}

#else
void CExcelTool::loadExcel(QString strFolderName, IExcelLoader *pLoader)
{
    Q_UNUSED(strFolderName);
    Q_UNUSED(pLoader);
    qWarning()<<"CExcelTool::loadExcel 非Win平台不处理Excel数据加载逻辑";
}
#endif

void CExcelTool::loadExcel2(QString strSheetName, IExcelLoader *pLoader)
{
    if(strSheetName.contains(".xls")){//兼容老版本
        strSheetName = strSheetName.left(strSheetName.length()-4);
    }

    qDebug()<<"CExcelTool::loadExcel 开始处理文件";
    QString strPath = QApplication::applicationDirPath() + "/Table.xls";
    QFile file(strPath);
    if(!file.exists()){
        qWarning() << "CExcelTool::loadExcel 路径错误，或文件不存在,路径为"<<strPath;
        return;
    }

    qInfo()<<"启动excel...";
    QAxObject *excel = new QAxObject("Excel.Application");//excel应用程序
    qInfo()<<"设置界面不可见...";
    excel->dynamicCall("SetVisible(bool)", false); //true 表示操作文件时可见，false表示为不可见
    qInfo()<<"开始查找sheet页...";
    QAxObject *workbooks = excel->querySubObject("WorkBooks");//所有excel文件
    QAxObject *workbook = workbooks->querySubObject("Open(QString&)", strPath);//按照路径获取文件
    QAxObject * worksheets = workbook->querySubObject("WorkSheets");//获取文件的所有sheet页
    QAxObject * worksheet = worksheets->querySubObject("Item(QString)", strSheetName);//获取文件sheet页
    if(nullptr == worksheet){
        qWarning()<<"CExcelTool::loadExcel "<<strSheetName<<"Sheet页不存在。";
        return;
    }
    qInfo()<<"sheet页查找结束...";
    QAxObject * usedrange = worksheet->querySubObject("UsedRange");//有数据的矩形区域

    //获取行数
    QAxObject * rows = usedrange->querySubObject("Rows");
    int nRows = rows->property("Count").toInt();
    qDebug()<<"CExcelTool::loadExcel 文件数据行数为"<<nRows-1<<"，不含表头首行";
    if(nRows <= 1){
        qWarning()<<"CExcelTool::loadExcel 无数据，跳过该文件";
        return;
    }

    //获取列数
    QAxObject * columns = usedrange->querySubObject("Columns");
    int nColumns = columns->property("Count").toInt();
    qDebug()<<"CExcelTool::loadExcel 文件数据列数为"<<nColumns;

    QVector<QVector<QString>> vecDatas;//获取所有数据

    qInfo()<<"读可用数据...";
    QVariant var = usedrange->dynamicCall("Value");
    qInfo()<<"读可用数据完毕...";
    foreach(QVariant varRow,var.toList()){
        QVector<QString> vecDataRow;
        foreach(QVariant var,varRow.toList()){
            vecDataRow.push_back(var.toString());
        }
        vecDatas.push_back(vecDataRow);
    }
    qInfo()<<"数据载入vec完毕...";

    //关闭文件
    workbook->dynamicCall("Close()");
    excel->dynamicCall("Quit()");
    if (excel)
    {
        delete excel;
        excel = NULL;
    }

    qInfo()<<"开始导入...";
    pLoader->loadExcel(vecDatas);//输送数据
    qInfo()<<"CExcelTool::loadExcel 文件处理结束，"<<strSheetName;
}
